package com.killer_jin.core.common.util.dynamicProxy.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

// cglib是针对类来实现代理的，原理是对指定的业务类生成一个子类，并覆盖其中业务方法实现代理。因为采用的是继承，
// 所以不能对final修饰的类进行代理。
public class CglibProxyInterfaceDemoProxy implements MethodInterceptor {
    private Object target;//业务类对象，供代理方法中进行真正的业务方法调用

    // 相当于JDK动态代理中的绑定
    public Object bind(Object target) {
        this.target = target;  //给业务对象赋值
        Enhancer enhancer = new Enhancer(); //创建加强器，用来创建动态代理类
        enhancer.setSuperclass(this.target.getClass());  //为加强器指定要代理的业务类（即：为下面生成的代理类指定父类）
        //设置回调：对于代理类上所有方法的调用，都会调用CallBack，而Callback则需要实现intercept()方法进行拦
        enhancer.setCallback(this);
        // 创建动态代理类对象并返回
        return enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("(Cglib)执行业务代码之前: 阿金哥开心地打开了电脑,启动了IDEA, 有道笔记, qq, 微信, 钉钉, 还有快播.");
        methodProxy.invokeSuper(obj, args); //调用业务类（父类中）的方法
        System.out.println("(Cglib)执行业务代码之后: 阿金哥果断关机后回家了.");
        return null;
    }
}
